package com.cskaoyan.keythrow;

/*
        throw
            a.在方法体中使用
            b.主动在程序中抛出异常
            b.每次只能抛出某一个异常对象

       基本语法：
            throw 异常对象
    注意事项：
    1. 若要抛出编译时异常，则必须和throws配合起来使用
    2. throw关键字的执行特征，只要执行了throw关键字，抛出异常，
        方法体中，throw之后的代码就不会执行(除非throw，写在try块中)


 */
public class Demo1 {

    public static void main(String[] args) throws Exception {
        ThrowClass throwClass = new ThrowClass();

        // 如果不想处理编译时异常，可以继续使用throws关键字，向上抛出
        try {
            throwClass.recordScore(200);
        } catch (Exception e) {
            // 如果我们自己捕获处理了异常，jvm不会在继续把这个异常继续向上报告
            throw  e;
        }

    }
}

class ThrowClass {

    /*
         假设该方法模拟了登记学生考试分数的操作，0-100
     */
    public void recordScore(int score) throws Exception {
        // 如果 score的值是200
        if (score < 0 || score > 100) {
            // 分数非法
//            RuntimeException runtimeException
//                    // 在创建RuntimeException对象时所传递的字符串，就是异常对象的描述字符串
//                    = new RuntimeException("分数非法，分数为：" + score);

            // 抛出异常
            //throw  runtimeException;


            // 抛出一个编译时异常
            Exception exception = new Exception("编译时异常：分数非法，分数为：" + score);
            // 编译时异常

            throw exception;

        }

        System.out.println("after throw");

        // 登分操作
    }
}
